package Risk.IHM;

//~--- JDK imports ------------------------------------------------------------

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

/**
 * Frame de configuration des options pendant la partie
 * @author Nicoleta Sergi
 */
public class FenetreOptions extends JFrame implements ActionListener {
    private static FenetreOptions instance         = null;
    private static final long     serialVersionUID = 1L;

    // pour acceder au panel de l'image de la carte et appeler repaint
    private ImageCarte imgCarte;

    // composantes graphiques de la fenetre
    private JCheckBox    jcbAfficheNomPays, jcbAffichePossesion;
    private JRadioButton jrbSurlignageCouleur;
    private JRadioButton jrbSurlignageGris;

    /**
     * constructeur fenetre
     */
    private FenetreOptions() {
        super("Options ...");
        this.setLayout(new BorderLayout());

        // en haut de la frame
        JLabel jlChoixCouleur = new JLabel("Choissisez une couleur de surlignage de la carte");

        // panel du milieur qui contient les radioBoutons pour la mise en surbrilance des pays sur la carte
        JPanel pRadBout = new JPanel(new GridLayout(2, 1));

        pRadBout.setBorder(BorderFactory.createEtchedBorder(Color.BLACK, Color.GRAY));

        // les radio buttons
        jrbSurlignageGris = new JRadioButton("Surligner en gris");
        jrbSurlignageGris.addActionListener(this);
        jrbSurlignageGris.setSelected(false);
        jrbSurlignageCouleur = new JRadioButton("Surligner en couleur");
        jrbSurlignageCouleur.addActionListener(this);

        // ajout des boutons au buttonGroup
        ButtonGroup bg = new ButtonGroup();

        bg.add(jrbSurlignageCouleur);
        bg.add(jrbSurlignageGris);

        // ajout des boutons au panel milieu
        pRadBout.add(jrbSurlignageCouleur);
        pRadBout.add(jrbSurlignageGris);

        JPanel jpBas = new JPanel(new GridLayout(2, 1));

        jcbAfficheNomPays = new JCheckBox("Afficher les noms des pays");
        jcbAfficheNomPays.setMnemonic(KeyEvent.VK_A);
        jcbAfficheNomPays.setDisplayedMnemonicIndex(0);
        jcbAfficheNomPays.addActionListener(this);
        jcbAffichePossesion = new JCheckBox("Afficher les possesions des joueurs");
        jcbAffichePossesion.setMnemonic(KeyEvent.VK_P);
        jcbAffichePossesion.setDisplayedMnemonicIndex(13);
        jcbAffichePossesion.addActionListener(this);
        jpBas.add(jcbAfficheNomPays);
        jpBas.add(jcbAffichePossesion);

        // ajout des composantes a la frame
        this.add(jlChoixCouleur, BorderLayout.NORTH);
        this.add(pRadBout, BorderLayout.CENTER);
        this.add(jpBas, BorderLayout.SOUTH);
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
            }
        });
        this.pack();
        
        // position de la fenetre au millieur de l'ecran
	Dimension	ecran = Toolkit.getDefaultToolkit().getScreenSize();       
        Dimension frameSize = this.getSize();
        this.setLocation((ecran.width - frameSize.width)/2,(ecran.height - frameSize.height)/2);
        
        this.setVisible(true);
    }

    /**
     * gestion d'evenements
     * @param e - evenement provoque
     */
    public void actionPerformed(ActionEvent e) {
        Object o = e.getSource();
        /**
         * affichage des noms des pays sur la carte
         */
        if (o.equals(jcbAfficheNomPays)) {
            if (imgCarte != null) {

                // affiche les noms des pays
                imgCarte.setAfficherNomPays(jcbAfficheNomPays.isSelected());
                imgCarte.repaint();
            }
        }
        /**
         * affichage des possessions des joueurs
         */
        if (o.equals(jcbAffichePossesion)) {
            if (imgCarte != null) {

                // dessiner les possesions de chaque joueur
                imgCarte.setAfficherPossessions(jcbAffichePossesion.isSelected());
                imgCarte.repaint();
            }
        }
        /**
         * mise en surbrillance en couleur sur la carte (par defaut)
         */
        if (o.equals(jrbSurlignageCouleur)) {
            if (imgCarte != null) {

                // surligne en couleur les pays sur la carte
                imgCarte.setSurligner_couleur(true);
                imgCarte.repaint();
            }
        }
        /**
         * mise en surbrillance en niveaux de gris
         */
        if (o.equals(jrbSurlignageGris)) {
            if (imgCarte != null) {

                // surligner en gris les pays sur la carte
                imgCarte.setSurligner_couleur(false);
                imgCarte.repaint();
            }
        }
    }

    /**
     * remise a zero de radio boutons et checkbox sur la fenetre 
     */
    public void razOptions() {
        jrbSurlignageCouleur.setSelected(false);
        jrbSurlignageGris.setSelected(false);
        jcbAfficheNomPays.setSelected(false);
        jcbAffichePossesion.setSelected(false);
    }
    /**
     * singleton pour recuperer l'instance de la fenetre
     * @param imgCarte - le panel de la carte
     * @return - l'instance de la classe FenetreOptions
     */
    public static FenetreOptions getInstance(ImageCarte imgCarte) {
        if (instance == null) {
            instance = new FenetreOptions();
        }

        instance.setVisible(true);
        instance.setImgCarte(imgCarte);

        return instance;
    }

    /**
     * methode qui retourne le choix de selection du checkbox
     * @return true ou false
     */
    public boolean isCentreToDisplay() {
        return jcbAfficheNomPays.isSelected();
    }
    /**
     * setter
     * @param imgCarte - le nouveau panel de la carte de jeu
     */
    public void setImgCarte(ImageCarte imgCarte) {
        this.imgCarte = imgCarte;
        jcbAffichePossesion.setSelected(imgCarte.isAfficherPossessions());
        jrbSurlignageCouleur.setSelected(imgCarte.isSurligner_couleur());
        jcbAfficheNomPays.setSelected(imgCarte.isAfficherNomPays());
    }
}
